/**
 * PPH项目公共工具函数
 * 从重复代码中提取的通用功能
 */

import { ElMessage } from 'element-plus'

/**
 * 格式化日期时间显示
 * @param dateStr 日期字符串
 * @returns 格式化后的日期时间字符串
 */
export function formatDateTime(dateStr: string): string {
  if (!dateStr) return '-'
  
  try {
    const date = new Date(dateStr)
    if (isNaN(date.getTime())) return dateStr
    
    return date.toLocaleString('zh-CN', {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit'
    })
  } catch (error) {
    console.warn('日期格式化失败:', error)
    return dateStr
  }
}

/**
 * 导出数据到Excel文件
 * @param data 要导出的数据数组
 * @param filename 文件名（不含扩展名）
 * @param sheetName 工作表名称
 */
export function exportToExcel(data: any[], filename: string, sheetName: string = 'Sheet1'): void {
  try {
    if (!data || data.length === 0) {
      ElMessage.warning('没有数据可导出')
      return
    }

    // 简化的CSV导出（避免XLSX依赖问题）
    const csvContent = convertToCSV(data)
    const timestamp = new Date().toISOString().slice(0, 19).replace(/[:-]/g, '')
    const fullFilename = `${filename}_${timestamp}.csv`

    // 创建下载链接
    const blob = new Blob(['\uFEFF' + csvContent], { type: 'text/csv;charset=utf-8;' })
    const link = document.createElement('a')
    const url = URL.createObjectURL(blob)

    link.setAttribute('href', url)
    link.setAttribute('download', fullFilename)
    link.style.visibility = 'hidden'
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)

    ElMessage.success(`导出成功: ${fullFilename}`)
  } catch (error) {
    console.error('Excel导出失败:', error)
    ElMessage.error('导出失败: ' + (error as any)?.message || String(error))
  }
}

/**
 * 将数据转换为CSV格式
 * @param data 数据数组
 * @returns CSV字符串
 */
function convertToCSV(data: any[]): string {
  if (!data || data.length === 0) return ''

  // 获取表头
  const headers = Object.keys(data[0])
  const csvHeaders = headers.join(',')

  // 转换数据行
  const csvRows = data.map(row => {
    return headers.map(header => {
      const value = row[header]
      // 处理包含逗号或引号的值
      if (typeof value === 'string' && (value.includes(',') || value.includes('"'))) {
        return `"${value.replace(/"/g, '""')}"`
      }
      return value || ''
    }).join(',')
  })

  return [csvHeaders, ...csvRows].join('\n')
}

/**
 * 重置表单数据和验证状态
 * @param formRef 表单引用
 * @param formData 表单数据对象
 * @param defaultValues 默认值对象（可选）
 */
export function resetForm(formRef: any, formData: any, defaultValues: any = {}): void {
  try {
    // 重置表单验证状态
    if (formRef && formRef.resetFields) {
      formRef.resetFields()
    }
    
    // 重置表单数据
    Object.keys(formData).forEach(key => {
      if (defaultValues.hasOwnProperty(key)) {
        formData[key] = defaultValues[key]
      } else {
        // 根据类型设置默认值
        const value = formData[key]
        if (typeof value === 'string') {
          formData[key] = ''
        } else if (typeof value === 'number') {
          formData[key] = 0
        } else if (Array.isArray(value)) {
          formData[key] = []
        } else if (typeof value === 'boolean') {
          formData[key] = false
        } else {
          formData[key] = null
        }
      }
    })
    
    console.log('✅ 表单重置完成')
  } catch (error) {
    console.error('表单重置失败:', error)
  }
}

/**
 * 深拷贝对象
 * @param obj 要拷贝的对象
 * @returns 拷贝后的对象
 */
export function deepClone<T>(obj: T): T {
  if (obj === null || typeof obj !== 'object') {
    return obj
  }
  
  if (obj instanceof Date) {
    return new Date(obj.getTime()) as any
  }
  
  if (Array.isArray(obj)) {
    return obj.map(item => deepClone(item)) as any
  }
  
  const cloned = {} as T
  Object.keys(obj).forEach(key => {
    (cloned as any)[key] = deepClone((obj as any)[key])
  })
  
  return cloned
}

/**
 * 防抖函数
 * @param func 要防抖的函数
 * @param delay 延迟时间（毫秒）
 * @returns 防抖后的函数
 */
export function debounce<T extends (...args: any[]) => any>(
  func: T,
  delay: number
): (...args: Parameters<T>) => void {
  let timeoutId: number
  
  return (...args: Parameters<T>) => {
    clearTimeout(timeoutId)
    timeoutId = setTimeout(() => func(...args), delay)
  }
}

/**
 * 节流函数
 * @param func 要节流的函数
 * @param delay 延迟时间（毫秒）
 * @returns 节流后的函数
 */
export function throttle<T extends (...args: any[]) => any>(
  func: T,
  delay: number
): (...args: Parameters<T>) => void {
  let lastCall = 0
  
  return (...args: Parameters<T>) => {
    const now = Date.now()
    if (now - lastCall >= delay) {
      lastCall = now
      func(...args)
    }
  }
}
